package laugh.service;

import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpSession;

import laugh.dao.ContentDao;
import laugh.pojo.Content;
import laugh.pojo.OptResultInfo;
import laugh.util.Constants;
import laugh.util.IKProvider;
import laugh.util.MD5Util;

import org.wltea.analyzer.core.IKSegmenter;
import org.wltea.analyzer.core.Lexeme;

/**
 * 
*    
* 项目名称：LaughFactory   
* 类名称：ContentService   
* 类描述： 内容服务类
* 创建人：wizard   
* 创建时间：2012-3-27 下午02:17:52   
* 修改人：wizard   
* 修改时间：2012-3-27 下午02:17:52   
* 修改备注：   
* @version 0.9
*
 */
public class ContentService {

    /**
     * 将IKSegmenter对象中的内容分词、计数放入Map(key:关键词,value:出现的次数)中
     * 
     * @param iksegmeter
     * @return Map<String, Integer>
     */
    private Map<String, Integer> splitContent(IKSegmenter iksegmeter) {
        Lexeme lexeme = null;
        Map<String, Integer> result = new HashMap<String, Integer>();
        try {
            while ((lexeme = IKProvider.ikSegmenter.next()) != null) {
                String key = lexeme.getLexemeText();
                System.out.println("key:" + key);
                if (result.containsKey(key)) {
                    int oldCount = result.get(key);
                    result.put(key, oldCount + 1);
                } else {
                    result.put(key, 1);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 将Map中的关键词按出现次数降序排序,取前Constants.KEY_NUM个拼成按逗号分隔的字符串
     * 
     * @param map
     * @return String
     */
    private String generateKeyString(Map<String, Integer> map) {
        StringBuffer sb = new StringBuffer();
        List<Map.Entry<String, Integer>> infoIds = new ArrayList<Map.Entry<String, Integer>>(
                map.entrySet());
        // 排序
        Collections.sort(infoIds, new Comparator<Map.Entry<String, Integer>>() {
            public int compare(Map.Entry<String, Integer> o1,
                    Map.Entry<String, Integer> o2) {
                return (o2.getValue() - o1.getValue());
            }
        });
        for (int i = 0; (i < Constants.KEY_NUM) && (i < infoIds.size()); i++) {
            sb.append(infoIds.get(i).getKey()+",");
        }
        String keywords=sb.toString();
        if(keywords.length()>0){
            keywords=keywords.substring(0, keywords.length()-1);
        }
        System.out.println("关键词列表:" + sb.toString());
        return keywords;
    }

    /**
     * 获取关键词列表的md5值
     * 
     * @param keyString
     * @return String
     */
    private synchronized String keyString2MD5(String keyString) {
        if (keyString == null || "".equals(keyString)) {
            return "";
        }
        return MD5Util.getMD5(keyString.getBytes());
    }

    /**
     * 获取内容的关键词列表（逗号分隔）
     * @param content
     * @return String
     */
    private synchronized String content2Keywords(String content){
        if (content == null || "".equals(content)) {
            return "";
        }
        Reader reader = new StringReader(content);
        IKProvider.ikSegmenter.reset(reader);
        return generateKeyString(splitContent(IKProvider.ikSegmenter));
    }
    
    /**
     * 添加内容
     * @param content
     * @return OptResultInfo
     */
    public OptResultInfo addContentWithCheck(Content content,HttpSession session){
        OptResultInfo optResultInfo=new OptResultInfo();
        String keywords=content2Keywords(content.getContent());
        String md5=keyString2MD5(keywords);
        content.setKeywords(keywords);
        content.setMd5(md5);
        //启用内容查重
        if(Integer.valueOf(Constants.rb.getString("content.checkexist"))==1){
            boolean flag=new ContentDao().checkContentExist(md5);
            //怀疑有重复内容
            if(flag){
                session.setAttribute("new_content", content);
                optResultInfo.setCode(0);//未添加
                optResultInfo.setInfo(1L);//可能存在重复内容
                optResultInfo.setMeg("可能已经存在类似内容");
                return optResultInfo;
            }
            //经检查，没有重复内容
            else{
                optResultInfo=new ContentDao().addContent(content);
            }
        }
        //不启用内容查重
        else{
            optResultInfo=new ContentDao().addContent(content);
        }
        return optResultInfo;
    }
    
    /**
     * 从session中取content内容插入数据库
     * @param session
     * @return OptResultInfo
     */
    public OptResultInfo addContentFromSession(HttpSession session){
        OptResultInfo optResultInfo=new OptResultInfo();
        Content content;
        Object object=session.getAttribute("new_content");
        if(object==null){
            optResultInfo.setCode(0);//未添加
            optResultInfo.setInfo(2L);//session中没有content内容记录
            optResultInfo.setMeg("添加失败,请重试");
            return optResultInfo;
        }else{
            content=(Content)object; 
            optResultInfo=new ContentDao().addContent(content);
            session.removeAttribute("new_content");
        }
        return optResultInfo;
    }
    
}
